Golang申请Windows及MacOS的管理员执行权限

7,979次阅读
4 条评论

共计 1035 个字符,预计需要花费 3 分钟才能阅读完成。

前言

最近基于 Fyne 这个 Golang 的 Gui 库开发了一款 Github Hosts 同步工具,有兴趣可以到 https://github.com/Licoy/fetch-github-hosts 查看源码(允许的话还可以点一个小小的 star)。

这款程序的主要功能由于是修改系统的 hosts,所以需要的权限就特别高。在 Windows 下需要以管理员身份执行,MacOS/Liunx 下需要使用 sudo 执行,但是 Fyne 框架并没有提供权限申请的 API,所以就开始了捣鼓之旅。

Golang 申请 Windows 及 MacOS 的管理员执行权限

寻找方案

在初次想到解决这个问题方案的时候,脑海里浮现的就是在程序内使用 exec command 来运行申请权限的语句,然后再来执行本程序。但是奈何才疏学浅,根本就不知道什么命令可以完成这个操作。

然后就开始在 Fyneissue里找有没有人和我有同样的问题,果然不出所料,在 #1265 中,有人遇到了和我一样的问题,不过此 issue 现在还是打开状态,但 … 有人在下面给出了临时解决方案,使用一个第三方库:https://github.com/getlantern/elevate

解决

getlantern/elevate 中,作者实现了 WindowsMacOS下的提权逻辑,只有 Linux 还没实现,不过对于我来说也够了。

看了给出的 Demo,开始我还以为是需要提供一个需要管理员执行的命令才可以启动,后来才发现我绕偏了。

两个参数:一个是name,代表需要启动的程序完整路径;第二个是args,代表程序的启动参数;这里的程序指代的是自己需要进行提权的程序。

于是,在程序启动的时候传入这两个参数即可,例如在 fetch-github-hosts 中的实现为:

// 解析参数
args := ParseBootArgs() 
// 如果没有禁止提权申请及非提权申请状态以及非 Linux 系统时,则进行提权操作
if !args.DontEscalate && !args.Escalate && runtime.GOOS != Linux {
    // 传入进入提权状态参数
    cmd := elevate.Command(os.Args[0], "--escalate")
    // 开始运行
    cmd.Run()
    // 结束
    os.Exit(0)
}
// 下面为启动后的业务代码
// other code...

后记

经过这一番折腾,在寻找解决方案的过程中,对 Fyne 这个 GUI 库和系统底层权限又多了一些认识。

总之问题是时常遇见的,多几分耐心,如果不是前沿技术,大概率这个问题都会有人遇到过及有对应的解决方案。

正文完
使用官方微信小程序体验更多功能
post-qrcode
 9
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy 于2022-06-22发表,共计1035字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(4 条评论)
annoy 评论达人 LV.1
2025-03-14 09:49:33 回复

Hello你好

 Windows  Edge  加拿大不列颠哥伦比亚
冰红茶 评论达人 LV.1
2023-10-23 10:30:17 回复

厉害

 Windows  Chrome  中国福建省福州市联通
三五笑话 评论达人 LV.1
2023-01-23 23:26:32 回复

不知道说啥,开心快乐每一天吧!

 Windows  Chrome  中国北京北京市联通
评论达人 LV.1
2022-10-12 13:31:17 回复

感谢分享@

 Macintosh  Chrome  中国上海上海市电信

憧憬点滴记忆

公告
Puock是一款基于WordPress开发的高颜值自适应开源主题,支持白天与黑夜模式、无刷新加载等功能。
文章搜索
憧憬点滴记忆
憧憬点滴记忆
Licoy's Blog关注互联网及软件IT技术的个人博客
今日一言
-「
热门文章
《活着》 – 人所体现生命的价值

《活着》 – 人所体现生命的价值

前言 在新年目标中为了定了一个读书计划,计划在 18 年中阅读 20 本各方面的书籍,目前阅读计划已经阅读了两...
Chatroulette-全世界随机视频聊天网站

Chatroulette-全世界随机视频聊天网站

介绍 Chatroulette 被人们叫做“聊天轮盘”是由一个 17 岁俄国高中生创立的随机视频聊天网站。该网...
Puock主题常见问题汇总

Puock主题常见问题汇总

前言 最近经常会收到小伙伴的一些老生常谈过的的问题,鉴于有些小伙伴因为网络原因无法及时访问到 Github 上...
SpringCloud使用Zuul出现“Forwarding error”错误解决方法

SpringCloud使用Zuul出现“Forwarding error”错误解决方法

起因 博主在使用 zuul 的时候,所有的配置都是配置完全了的,但是只要一访问服务就出现 500,然后查看控制...
岛屿数量计算中的DFS和BFS的应用

岛屿数量计算中的DFS和BFS的应用

前言 计算岛屿数量是在由 ’0’ 与 ’1’ 的二维网格中寻找...
最新评论
憧憬Licoy 憧憬Licoy 暂时不做友联申请了
憧憬Licoy 憧憬Licoy 暂时不做友联申请了
YanQS YanQS 名称:YanQS's Blog 网址:https://yanqs.me/
ygtg ygtg 很好 :beer:
ssdfg ssdfg 用户中心太简陋了! :grin:
mp4网 mp4网 申请友链 名称:mp4网 地址:http://mp4wang.cc 描述:多来看看
xf xf 感谢作者的分享
朵朵 朵朵 过来看看
热评文章